Classes en python

Le but de cette présentation est de présenter le minimum de syntaxe python nécessaire aux chapitres 4 et suivants de ce cours. Dès lors, ce n'est qu'une présentation très partielle de la partie orientée objet de python.

Pour des questions plus pointues, vous référer à la référence du langage.

On peut définir une classe élémentaire selon la syntaxe ci-dessous

In [1]:
class Ma_Classe:
    def __init__(self, param):       
        print("Initialisation")
        self.attribut = param
        self.__attribut_prive = "privé"
        
    def une_methode(self,param):
        print(self.attribut, param)
        
    def une_methode_sans_parametre(self):
        print(self.attribut, "une_methode_sans_parametre")

Le premier paramètre de toutes les méthodes est l'objet lui même, i.e. l'instanciation de la classe qui appelle la méthode

La méthode __init__ correspond au constructeur en C++. Elle est appelée quand on crée un objet et sert à en initialiser les attributs

In [2]:
mon_objet = Ma_Classe("Hello")
Initialisation

On peut accéder aux attributs de l'objet directement

In [3]:
print(mon_objet.attribut)
Hello

On peut même accéder aux attributs privés. __NomAttribut est décoré hors de la classe en _NomClasse__NomAttribut

In [4]:
print(mon_objet._Ma_Classe__attribut_prive)
privé

On peut appeler les méthodes via

In [5]:
mon_objet.une_methode("World")
Hello World

qui est en fait du sucre syntactique sur l'appel de la fonction

In [6]:
Ma_Classe.une_methode(mon_objet,"World")
Hello World

Une méthode n'a pas nécessairement de paramètre

In [7]:
mon_objet.une_methode_sans_parametre()
Hello une_methode_sans_parametre

Toute fonction peut devenir une méthode de la classe de son premier paramètre. Il suffit d'écrire

In [8]:
def une_fonction(obj):
    print(obj.attribut,"une fonction externe")

Ma_Classe.une_autre_methode = une_fonction
In [9]:
mon_objet.une_autre_methode()
Hello une fonction externe

qui, rappelons-le, n'est que du sucre autour de

In [10]:
Ma_Classe.une_autre_methode(mon_objet)
Hello une fonction externe

On peut afficher un objet avec la fonction print, mais le résultat n'est pas très intéressant

In [11]:
print(mon_objet)
<__main__.Ma_Classe object at 0x107d26b70>

Mais on peut customiser l'affichage en définissant la méthode magique __str__ qui doit retourner une string. Par exemple

In [12]:
def maclasse_to_string(obj):
    return "Attribut: {}".format(obj.attribut)

Ma_Classe.__str__ = maclasse_to_string
In [13]:
print(mon_objet)
Attribut: Hello

Il y a de nombreuses autres fonctions magiques, qui permettent entre autre de surcharger les opérateurs. Par exemple, pour émuler les types numériques, on peut surcharger l'opérateur + en définissant __add__(self,other).

Pour les types conteneurs qui nous intéressent dans ce cours d'ASD, on notera entre autres

  • __len__(self) qui est appelé par la fonction len(Conteneur) et retourne le nombre d'éléments
  • __getitem__(self) et __setitem__(self,val) qui surchargent l'opérateur [] d'accès indexé

ASD1 Notebooks on GitHub.io

© Olivier Cuisenaire, 2018